package 框架学习.SpringBoot.原理.springboot原理.自动配置.自动配置的原理.如何把依赖加入IOC容器;

/**
 * 自动配置的原理——如何把依赖加入IOC容器<p>
 * 详见项目<a href="">springboot-auto-configuration</a>
 */
public class index {
    /**
     * springboot项目的启动类自带包扫描的功能，但只是包启动类当前包及其子包<p>
     * 而引入的第三方依赖，并不在这个范围内<p>
     * 那么springboot是如何将我们引入的依赖加入到IOC容器中的？<p></p>
     * <p>
     * 在项目<a href="">springboot-auto-configuration</a>中<p>
     * 模块test-module中已经引入了自己定义的example-utils这个模块（依赖）<p>
     * 而第一次测试时springboot并没有将example-utils模块中加上了@Component注解的类加入到IOC容器中<p>
     * 这是因为springboot项目的启动类自带包扫描的功能，但只是包启动类当前包及其子包<p></p>
     * <p></p>
     * 方案1：通过<a href="">@ComponentScan注解来手动指定要扫描哪些包</a><p>
     * 加上了<a href="">@ComponentScan({"com.example", "com.example.testmodule"})</a>后，测试通过<p>
     * 但这种方式操作繁琐，由于大面积的扫描，性能也低<p>
     * 而且我们之前使用springboot时，引入第三方依赖，并没有去指定扫描的包<p></p>
     * <p></p>
     * <p>
     * 方案2：<a href="">@Import</a>注解导入。在启动类上使用@Import注解导入的类会被Spring加载到IOC容器中<p>
     * 导入形式主要有以下几种：<p>
     * 1、导入 普通类（类上可以不用加任何注解，包括@Component）<p>
     * 2、导入 配置类（类上可以不用加任何注解，包括@Component，但由于其是配置类，还是需要加上@Configuration）<p>
     * 3、导入 ImportSelector接口实现类，该实现类中定指定的类会被全部放入IOC容器中<p>
     * 而这种方法，同样很繁琐<p>
     * <p></p>
     * <p>
     * 其实，我们要导入第三方依赖（模块），将其中的类对象加入到IOC容器中<p>
     * 对于要加入哪些类对象，第三方依赖（模块）自己才是最清楚的<p>
     * 所以我们可以让第三方依赖（模块）自己来指定<p></p>
     * 方案3：让第三方依赖为我们提供一个注解（一般以@EnableXxxx格式，当然也可以自定义），这个注解中要封装@Import注解，
     * 第三方依赖在@Import后来指定要导入哪些bean、哪些配置类<p></p>
     * <p></p>
     *
     * 而方案3也是springboot中所采用的方案<p>
     *
     *
     * @param args
     */
    public static void main(String[] args) {

    }
}
